export const timeOffsetA = 600000; // 白天课间偏移量，休息时间10分钟
export const timeOffsetP = 300000; // 晚上课间 ，5分钟
export const classLen = 2400000; // 课程长度 每节课 40 分钟 毫秒数
/**
 *  创建课程表结构 
 *  @return {Object} timetables
 *  timetable：{
	 ['year']:{
		 [month:string] : object[]
	 }
	 schoolOpen : {
		 year : number,
		 month : number,
		 day : number
	 },
	 schoolClose:{
		 year :number,
		 month : number,
		 day : number
	 }
	 
 }
 *  
 */
export function createTable(tables = []){
	
	 let minYear = 0;
	 const timetables = {};
	 // 期末月
	 let closeMonth = 13;
	 // 当前学年 最大月 如 2022-2023 学年 ，上学期最大月为 2022年 12月
	 let maxMonth = 0;
	 //开学月
	 let minMonth = 13;
	 //开学时间
	 let schoolOpen = {
		 year: 0,
		 month:12,
		 day:31,
	 };
	 //学期结束
	 let schoolClose = {
		 year:0,
		 month: 1,
		 day:1
	 }
	 tables.forEach((item)=>{
		 
		 const time =  new Date( (item.start).replace(/-/g, '/')) ;
		 const iYear = time.getFullYear();
		 const month = time.getMonth() + 1;
		 const day = time.getDate()
		 if(!timetables[iYear]){
			 timetables[iYear] = {}
			 if(minYear > iYear || minYear === 0) {
				 minYear = iYear;
			 }
		 }
	     //判断该月课表是否有已创建，
		//若创建直接根据月份和日期添加到当天的课表
		//否则，创建该月课表，
		 if(timetables[iYear][month]){
			 //找出学期末 月
			// console.log(item)
			
			 timetables[iYear][month][day - 1]['classList'].push(item)
		 }else {
			 timetables[iYear][month] = [];
			 //获取当月一共有多少天
			 const countDay = getMonthDay(iYear,month,0); 
			 for(let i= 0;i < countDay;i++){
				 let week = setDay(iYear,month,i+1);
				 timetables[iYear][month].push({
					 year:iYear,
					 month,
					 day:i + 1,
					 week,
					 classList:[]
				 })
			 }
			 //找出最小的开学 月
			 if( minYear === iYear  && minMonth > month){
			 	 minMonth = month
			 }
			 if( minYear === iYear  && maxMonth < month){
			 	 maxMonth = month
			 }
			 if(closeMonth > month) closeMonth = month 
			 
			 timetables[iYear][month][day - 1]['classList'].push(item)
		 }
		
	 })
    //找出开学日期
	for(let i = 0; i < timetables[minYear][minMonth].length;i++){
		if(timetables[minYear][minMonth][i]["classList"].length > 0){
			schoolOpen = {
				year:minYear,
				month : minMonth,
				day: timetables[minYear][minMonth][i]["day"]
			}
			break;
		}else{
			i = -1;
			timetables[minYear][minMonth].shift();
		}
	}
	//找出 期末 当 开学月份和 期末月份相等时代表 为 春季，反之为秋季，年份要加一
	// if(minMonth === closeMonth){
	//   schoolClose = findSchoolClose(timetables,minYear,maxMonth)
	  
	// }else{
		let year = minYear;
		let isNextyear = timetables[minYear + 1]
		
		schoolClose = findSchoolClose(timetables, isNextyear ? year + 1 : year , isNextyear ? closeMonth : maxMonth) 
	  
	  
	// }
	  
	 timetables.schoolClose = schoolClose
	 timetables.schoolOpen = schoolOpen;
	 return timetables 
}
//查找学期末
function findSchoolClose(timetables,year,month){
	const len = timetables[year][month].length
	if(!len) return null;
	for(let i = len - 1; i > 0 ;i--){
		if(timetables[year][month][i]["classList"].length > 0){
			return {
				year,
				month,
				day: timetables[year][month][i]["day"],
				week: setDay(year,month,timetables[year][month][i]["day"])
			}
		}else{
			timetables[year][month].pop();
		}
	}
}



/**排序课表  从小到大排序  
classList 为课程列表
每一个节课都是一个对象，必须有start属性才行，并且是 时间，
*/
export function sortClassLsit(classList=[]){
	classList.sort((a,b)=> new Date(a.start) - new Date(b.start))
}

//填充字符串
export function padStart(str,n,char){
	return str.padStart(n,char)
}


// 获取每个月的天数
function getMonthDay(year,month){
	
	return new Date(year,month,0).getDate()
}
//设置星期
export  function setDay(year,month,day){
	let str = null
	switch(new Date(year,month -1,day).getDay()){
		case 0 : str = "星期日";
			 break;
		case 1 : str = "星期一";
			 break;
		case 2 : str = "星期二";
			 break;
		case 3 : str = "星期三";
			 break;
		case 4 : str = "星期四";
			 break;
		case 5 : str = "星期五";
			 break;
	    case 6 : str = "星期六";
			 break;
	}
	return str;
	
}

/**
@startDate {string} 课程开始时间字符串
@endDate {string} 课程结束时间字符串  
@return {Numebr} 返回的课程长度
*/
export function computeClassLength (startDate,endDate){
	
   const start = new Date(startDate);
   const end = new Date(endDate)
   const time   =  end.getTime() - start.getTime();
   let len = null;
   if(start.getHours() < 18){
	   let iss = islen(start,end);
	   if( iss === '945120' || iss === "09451200") {
		   return 3;
	   }
	   len = computeTime(time,timeOffsetA);
   }else{
	   len = computeTime(time,timeOffsetP);
   }
   return len < 2 ? 2 : len
}

function islen(start,end){
	let s = start.getHours() +""+start.getMinutes();
	let e = end.getHours() + ""+ end.getMinutes();
	return s + e
}


/**
 * 计算课程长度 （上课总长 time + 课间偏移量 offset） / （一节课40分钟 + 课间偏移量） 
后面计算，课表每一门课的显示UI的高度需要用到
 */
function computeTime(time,offset){ 
	return Math.floor((time + offset) / (classLen +  offset)) 
}

//计算课程在当天的top偏移量
export function getOffset(start){
	const date = new Date(start);
	const h = date.getHours();
	const m = date.getMinutes();
	return offsetMap[`${h}:${m}`]
	
}
const offsetMap = {
	"8:0" : 0.8,
	"8:50" : 1.8,
	"9:45" : 2.8,
	"10:35" : 3.8,
	"11:20" : 4.8,
	"12:50" : 5.8,
	"13:40" : 6.8,
	"14:30" : 7.8,
	"15:15" : 8.8,
	'16:10' : 9.8,
	"16:55" : 10.8,
	"18:45" : 11.8,
	"19:30" : 12.8,
	"20:15" : 13.8,
	"21:5" : 14.8
}

export const orderList = [
	{
			id:1,
			start:{
				h : "8",
				m : "00"
			},
			end : {
				h : "8",
				m : "40"
			}
	},
		{
			id:2,
			start:{
				h : "8",
				m : "50"
			},
			end : {
				h : 8,
				m : 30
			}
		},
		{
			id:3,
			start:{
				h : 9,
				m : 45
			},
			end : {
				h : 10,
				m : 25
			}
		},
		{
			id:4,
			start:{
				h : 10,
				m : 35
			},
			end : {
				h : 11,
				m : 10
			}
		},
		{
			id:5,
			start:{
				h : 11,
				m : 20
			},
			end : {
				h : 12,
				m : "00"
			}
		},
		{
			id:6,
			start:{
				h : 12,
				m : 50
			},
			end : {
				h : 13,
				m : 30
			}
		},
		{
			id:7,
			start:{
				h : 13,
				m : 40
			},
			end : {
				h : 14,
				m : 20
			}
		},
		{
			id:8,
			start:{
				h : 14,
				m : 30
			},
			end : {
				h : 15,
				m : 10
			}
		},
		{
			id:9,
			start:{
				h : "15",
				m : "15"
			},
			end : {
				h : "16",
				m : "00"
			}
		},{
			id:"10",
			start:{
				h : "16",
				m : "10"
			},
			end : {
				h : "16",
				m : "50"
			}
		},
		{
			id:"11",
			start:{
				h : "16",
				m : "55"
			},
			end : {
				h : "17",
				m : "35"
			}
		},{
			id:"12",
			start:{
				h : "18",
				m : "45"
			},
			end : {
				h : "8",
				m :"40"
			}
		},
		,{
			id:"13",
			start:{
				h : "19",
				m : "30"
			},
			end : {
				h : "8",
				m : "40"
			}
		},{
			id:"14",
			start:{
				h : '20',
				m : "15"
			},
			end : {
				h : "8",
				m : "40"
			}
		},{
			id:'15',
			start:{
				h : "21",
				m : "05"
			},
			end : {
				h : "8",
				m : "40"
			}
		}]
